import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, AutoMinorLocator
import numpy as np

def plot_curve(title, xlabel, ylabel, x, y):
    plt.figure(figsize=(10, 6))
    plt.plot(x, y, linewidth=2, marker='o', color='blue')
    plt.xlabel(xlabel, size=15)
    plt.ylabel(ylabel, size=15)
    plt.title(title, size=20)
    plt.tick_params(axis='both', size=5, width=2,
                    direction='in', labelsize=15)
    plt.grid(color='midnightblue', linestyle='-.', linewidth=0.5)
    plt.show()

def plot_curves(title, xlabel, ylabel, x, y,ref_x,ref_y, filename):
    # 设置全局字体为 serif（默认的衬线字体）
    #plt.rcParams['font.family'] = 'serif'
    #plt.rcParams['font.serif'] = ['DejaVu Serif']  # 使用 DejaVu Serif 作为衬线字体
    plt.rcParams['font.family'] = 'Times New Roman'
    plt.rcParams['font.size'] = 20  # 设置默认字体大小

    plt.figure(figsize=(10, 8))
    # 绘制参考线
    plt.plot(ref_x, ref_y, linewidth=2, color='red',linestyle='--',label='Target')

    # 获取Blues色系的颜色
    colors = plt.cm.Blues(np.linspace(0.3, 1, len(x[0])))  # 从浅到深
    
    # 使用Blues色系绘制每一行
    for i in range(len(x[0])):
        plt.plot(x[:, i], y[:, i], linewidth=2, alpha=1.0, color=colors[i], label=f'Result {i+1}')
    
    # 设置坐标轴范围，确保从 (0, 0) 开始
    plt.xlim(left=0)
    plt.ylim(bottom=0)
    plt.xlim(right=ref_x[-1]*1.3)
    
    plt.xlabel(xlabel, size=20)
    plt.ylabel(ylabel, size=20)
     # 设置主刻度和子刻度
    ax = plt.gca()
    ax.xaxis.set_minor_locator(AutoMinorLocator(4))  # 每个主刻度之间4个子刻度
    ax.yaxis.set_minor_locator(AutoMinorLocator(4))  # 每个主刻度之间4个子刻度
    
    plt.tick_params(axis='both', size=5, width=2, direction='in', labelsize=20)
    plt.tick_params(axis='both', which='minor', size=3, width=1, direction='in')
    
    # 添加图例，并放置在合适的位置
    plt.legend(loc='upper right', bbox_to_anchor=(1, 1), fontsize=15, frameon=False)
    
    if filename is not None:
        plt.savefig(filename,dpi=600,format='svg')  # 保存绘图结果
    plt.pause(3)
    plt.close()

def plot_curves_optimization(title, xlabel, ylabel, x, y,ref_x,ref_y, filename):
    # 设置全局字体为 serif（默认的衬线字体）
    #plt.rcParams['font.family'] = 'serif'
    #plt.rcParams['font.serif'] = ['DejaVu Serif']  # 使用 DejaVu Serif 作为衬线字体
    plt.rcParams['font.family'] = 'Times New Roman'
    plt.rcParams['font.size'] = 20  # 设置默认字体大小

    plt.figure(figsize=(10, 8))
    # 绘制参考线
    plt.plot(ref_x, ref_y, linewidth=2, marker='o', color='red',linestyle='--',label='Target')

    # 获取Blues色系的颜色
    colors = plt.cm.Blues(np.linspace(0.5, 0.8, len(x[0])))  # 从浅到深
    
    # 使用Blues色系绘制每一行
    i=0
    plt.plot(x[:, i], y[:, i], linewidth=2, alpha=1.0, color=colors[i], label=f'Initial')
    i=-1
    plt.plot(x[:, i], y[:, i], linewidth=2, alpha=1.0, color=colors[i], label=f'Final')
    
    # 设置坐标轴范围，确保从 (0, 0) 开始
    plt.xlim(left=0)
    plt.ylim(bottom=0)
    plt.xlim(right=ref_x[-1]*1.3)
    
    plt.xlabel(xlabel, size=20)
    plt.ylabel(ylabel, size=20)
    # 设置主刻度和子刻度
    ax = plt.gca()
    ax.xaxis.set_minor_locator(AutoMinorLocator(4))  # 每个主刻度之间4个子刻度
    ax.yaxis.set_minor_locator(AutoMinorLocator(4))  # 每个主刻度之间4个子刻度
    
    plt.tick_params(axis='both', size=5, width=2, direction='in', labelsize=20)
    plt.tick_params(axis='both', which='minor', size=3, width=1, direction='in')
    
    # 添加图例，并放置在合适的位置
    plt.legend(loc='upper right', bbox_to_anchor=(1, 1), fontsize=15, frameon=False)
    
    if filename is not None:
        plt.savefig(filename, format='svg',dpi=600)  # 保存绘图结果
    plt.pause(3)
    plt.close()

def plot_curves_optimization_no_legend(title, xlabel, ylabel, x, y,ref_x,ref_y, filename):
    # 设置全局字体为 serif（默认的衬线字体）
    #plt.rcParams['font.family'] = 'serif'
    #plt.rcParams['font.serif'] = ['DejaVu Serif']  # 使用 DejaVu Serif 作为衬线字体
    plt.rcParams['font.family'] = 'Times New Roman'
    plt.rcParams['font.size'] = 20  # 设置默认字体大小

    plt.figure(figsize=(10, 8))
    # 绘制参考线
    plt.plot(ref_x, ref_y, linewidth=3, color='red',linestyle='--',label='Target')

    # 获取Blues色系的颜色
    colors = plt.cm.Blues(np.linspace(0.5, 0.8, len(x[0])))  # 从浅到深
    
    # 使用Blues色系绘制每一行
    #i=0
    #plt.plot(x[:, i], y[:, i], linewidth=2, alpha=1.0, color=colors[i], label=f'Initial')
    i=-1
    plt.plot(x[:, i], y[:, i], linewidth=3, alpha=1.0, color=colors[i], label=f'Final')
    
    # 设置坐标轴范围，确保从 (0, 0) 开始
    plt.xlim(left=0)
    plt.ylim(bottom=0)
    plt.xlim(right=ref_x[-1]*1.2)
    
    plt.xlabel(xlabel, size=20)
    plt.ylabel(ylabel, size=20)
    # 设置主刻度和子刻度
    ax = plt.gca()
    ax.xaxis.set_minor_locator(AutoMinorLocator(4))  # 每个主刻度之间4个子刻度
    ax.yaxis.set_minor_locator(AutoMinorLocator(4))  # 每个主刻度之间4个子刻度
    
    plt.tick_params(axis='both', size=5, width=2, direction='in', labelsize=20)
    plt.tick_params(axis='both', which='minor', size=3, width=1, direction='in')
    
    # 添加图例，并放置在合适的位置
    #plt.legend(loc='upper right', bbox_to_anchor=(1, 1), fontsize=15, frameon=False)
    
    if filename is not None:
        plt.savefig(filename, format='svg', dpi=600)  # 保存为 SVG 矢量图
    plt.pause(3)
    plt.close()

def plot_curves_flow(title, xlabel, ylabel, x, y,ref_x,ref_y, filename):
    plt.cla()
    # 使用浅灰色并设置透明度
    plt.plot(x, y, linewidth=2, color='gray', alpha=0.5)
    plt.plot(ref_x, ref_y, linewidth=2, marker='o', color='red')
    plt.xlabel(xlabel, size=15)
    plt.ylabel(ylabel, size=15)
    plt.title(title, size=20)
    plt.tick_params(axis='both', size=5, width=2,
                    direction='in', labelsize=15)
    plt.grid(color='midnightblue', linestyle='-.', linewidth=0.5)
    if filename is not None:
        plt.savefig(filename)  # 保存绘图结果
    plt.pause(0.01)  # 暂停0.1秒，以便更新图像
    #plt.close()
